package com.common.www.utils.wechat;


import com.alibaba.fastjson.JSONObject;
import com.common.www.service.redis.RedisTemplateService;

import com.common.www.utils.TxtUtil;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import org.springframework.web.client.RestTemplate;

import java.util.*;
import java.util.concurrent.TimeUnit;

import static com.common.www.redis.RedisConstant.WECHAT_TOKEN;

@Component
public class WeChatPayUtils {
    //    /**
//     * 商户的key(后台设置的key)
//     */
    public static String APIKEY = "mailekeji66666666666666666666666";
    public static String MP_APPID = WXConstant.MP_APPID;
    public static String MP_APPSECERT = WXConstant.MP_SECERT;
    public static String SHANGHUHAO = WXConstant.SHANGHUHAO;

    @Autowired
    protected RedisTemplateService redisTemplateService;
    @Autowired
    @Qualifier("simpleRestTemplate")
    protected RestTemplate restTemplate;

    /**
     * 得到微信的accesstoken（微信的失效期为2小时）
     */
    public String getWeChataccessToken() {

        String key = WECHAT_TOKEN;
        String token = redisTemplateService.get(key);
        if (!TxtUtil.isEmpty(token)) {
            return token;
        }

        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + MP_APPID + "&secret=" + MP_APPSECERT;

        String result = restTemplate.getForObject(url, String.class);

        JSONObject jsonObject = JSONObject.parseObject(result);
        token = jsonObject.getString("access_token"
        );
        redisTemplateService.set(key, token, 30, TimeUnit.MINUTES);

        return token;
    }

    /**
     * 得到微信的js使用ticket
     */
    public static String getJsapiTicket(RestTemplate restTemplate, String ACCESS_TOKEN) throws Exception {
        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + ACCESS_TOKEN + "&type=jsapi";

        String result = restTemplate.getForObject(url, String.class);

        JSONObject jsonObject = JSONObject.parseObject(result);
        Integer errcode = jsonObject.getInteger("errcode");
        if (errcode == 0) {
            String ticket = jsonObject.getString("ticket");
            return ticket;
        } else {
            throw new Exception("获取ticket失败");
        }
    }

    /**
     * 调用微信接口检查是否有补量信息 SEC
     *
     * @return 返回是否通过信息监测
     */
    public static boolean checkSEC(RestTemplate restTemplate, String token, String content) {
        String url = "https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + token;


        HttpHeaders headers = new HttpHeaders();
//        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);

        Map<String, Object> requestBody = new HashMap<>(2);
//        requestBody.put("access_token", token);
        requestBody.put("content", content);
        HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(requestBody, headers);
        ResponseEntity<String> response = null;

        String result = restTemplate.postForObject(url, httpEntity, String.class);
        JSONObject jsonObject = JSONObject.parseObject(result);
        Integer errcode = jsonObject.getInteger("errcode");
        String errmsg = jsonObject.getString("errmsg");

        if ("ok".equals(errmsg)) {
            return true;
        }
        return false;
    }


//
//    /**
//     * 得到小程序的签名（小程序拿到参数后需要对参数单独进行签名,需要在服务器得到预订单后再用固定的参数进行一次签名）
//     */
//    public static OrderWechatPrepare getXCSSign(OrderWechatPrepare wechatPrepare, String APIKEY) {
//        String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
//        map.add("appId", wechatPrepare.getAppid());//
//        map.add("timeStamp", TimeUtils.getLocalDatestamp());//
//        map.add("nonceStr", wechatPrepare.getNonce_str());//
//        map.add("package", "prepay_id=" + wechatPrepare.getPrepay_id());//
//        map.add("signType", wechatPrepare.getSign_type());//
//        map.add("paySign", getPrepareSign(map, APIKEY));//通过签名算法计算得出的签名值，详见签名生成算法,本行务必放在最后
//
//        for (int i = 0; i < map.size(); i++) {
//
//        }
//        wechatPrepare.setTimeStamp(map.get("timeStamp").toString().replace("[", "").replace("]", ""));
//        wechatPrepare.setPackageStr(map.get("package").toString().replace("[", "").replace("]", ""));
//        wechatPrepare.setPaySign(map.get("paySign").toString().replace("[", "").replace("]", ""));
//        return wechatPrepare;
//    }
//
//    /**
//     * 得到APP的签名（APP拿到参数后需要对参数单独进行签名,需要在服务器得到预订单后再用固定的参数进行一次签名）
//     */
//    public static OrderWechatPrepare getAPPSign(OrderWechatPrepare wechatPrepare, String APIKEY) {
//
//
//        wechatPrepare.setTimeStamp(new BigDecimal(System.currentTimeMillis() * 0.001).longValue() + "");
//        wechatPrepare.setPaySign(WXAPPPayHelper.getAPPSign(wechatPrepare.getAppid(),
//                wechatPrepare.getPrepay_id(), wechatPrepare.getNonce_str(), wechatPrepare.getTimeStamp(), wechatPrepare.getMch_id(), APIKEY
//        ));
//        wechatPrepare.setPackageStr(wechatPrepare.getPackageValue());
//
//        return wechatPrepare;
//    }
//
//
//    /**
//     * 得到微信签名
//     * 第一步：对参数按照key=value的格式，并按照参数名ASCII字典序排序如下：
//     * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
//     * 第二步：拼接API密钥：
//     * stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" //注：key为商户平台设置的密钥key
//     * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注：MD5签名方式
//     * sign=hash_hmac("sha256",stringSignTemp,key).toUpperCase()="6A9AE1657590FD6257D693A078E1C3E4BB6BA4DC30B23E0EE2496E54170DACD6" //注：HMAC-SHA256签名方式，部分语言的hmac方法生成结果二进制结果，需要调对应函数转化为十六进制字符串。
//     *
//     * @param map 微信参数列表
//     */
//    private static String getPrepareSign(MultiValueMap<String, Object> map, String APIKEY) {
//        TreeMap<String, Object> treeMap = new TreeMap<>();
//        //把map转换成treemap成有序映射
//        for (int i = 0; i < map.size(); i++) {
//            String key = map.keySet().toArray()[i] + "";
//            if ("sign".equals(key)) {
//                continue;
//            }
//            if ("paySign".equals(key)) {
//                continue;
//            }
//            treeMap.put(key, map.values().toArray()[i] + "");
//        }
//        List<Map.Entry<String, Object>> list = new ArrayList<Map.Entry<String, Object>>(treeMap.entrySet());
//        //然后通过比较器来实现排序
//        Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
//            //升序排序
//            public int compare(Map.Entry<String, Object> o1,
//                               Map.Entry<String, Object> o2) {
//                return o1.getKey().compareTo(o2.getKey());
//            }
//        });
//        String md5Str = "";
//        for (int i = 0; i < treeMap.size(); i++) {
//            if (i != 0) {
//                md5Str += "&";
//            }
//            md5Str += treeMap.keySet().toArray()[i] + "=" + treeMap.values().toArray()[i];
//        }
//        md5Str += "&key=" + APIKEY;
//        md5Str = md5Str.replace("[", "").replace("]", "");
//
//        String md5 = Md5Utils.MD5Encode(md5Str, true);
//        return md5;
//    }
//
//
//    /**
//     * 发送订阅消息
//     *
//     * @return 返回是否通过信息监测
//     */
//    public boolean sendSubscribeMessage(RestTemplate restTemplate,
//                                        boolean isRelease, String token,
//                                        String openId, String template_id,
//                                        String page, Object data) {
//        String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token;
//
//
//        HttpHeaders headers = new HttpHeaders();
////        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
//
//        Map<String, Object> requestBody = new HashMap<>(2);
//        requestBody.put("touser", openId);
//        requestBody.put("template_id", template_id);
//        if (isRelease) {
//            requestBody.put("miniprogram_state", "formal");
//        } else {
//            requestBody.put("miniprogram_state", "trial");
//        }
//        requestBody.put("page", page);
//        requestBody.put("data", data);
//
//        HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(requestBody, headers);
//        ResponseEntity<String> response = null;
//
//        String result = restTemplate.postForObject(url, httpEntity, String.class);
//        JSONObject jsonObject = JSONObject.parseObject(result);
//        Integer errcode = jsonObject.getInteger("errcode");
//        String errmsg = jsonObject.getString("errmsg");
//
//        if ("ok".equals(errmsg)) {
//            return true;
//        }
//        return false;
//    }

}
